影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟
延迟
DNS 查询( DNS Lookup ):浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是 DNS 。这个通常可以利用 DNS 缓存结果来达到减少这个时间的目的
建立连接( Initial connection ): HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大
错误通知的管理,在 HTTP1.1 中新增了 24 个错误状态响应码,如 409 ( Conflict )表示请求的资源与资源的当前状态发生冲突; 410 ( Gone )表示服务器上的某个资源被永久性的删除
它支持持续连接 . 通过这种连接 , 就有可能在建立一个 TCP 连接后 , 发送请求并得到回应 , 然后发送更多的请求并得到更多的回应 . 通过把建立和释放 TCP 连接的开销分摊到多个请求上 , 则对于每个请求而言 , 由于 TCP 而造成的相对开销被大大地降低了 . 而且 , 还可以发送流水线请求 , 也就是说在发送请求 1 之后的回应到来之前就可以发送请求 2. 也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端。
当连接建立起来以后 , 浏览器发送一个请求 , 之后一个回应消息被送回来 . 然后 TCP 连接被释放 . 这在早期 ,Web 页面通常只包含 HTML 文本 , 在这种情况下 , 这样的做法已经足够了 . 但是 , 网页一般还含有大量的图标 , 图象以及其他很养眼的内容 , 所以建立一个 TCP 连接仅仅传输一个图标 , 则显得代价太昂贵了。
服务端推送能把客户端所需要的资源伴随着 index.html 一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。
假定一个页面有 100 个资源需要加载(这个数量对于今天的 Web 而言还是挺保守的) , 而每一次请求都有 1kb 的消息头(这同样也并不少见,因为 Cookie 和引用等东西的存在) , 则至少需要多消耗 100kb 来获取这些消息头。 HTTP2.0 可以维护一个字典,差量更新 HTTP 头部,大大降低因头部传输产生的流量。